﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LCTMoodle.Models.ViewModels;
using LCTMoodle.Models.DataModels;
using LCTMoodle.Helper;
using LCTMoodle.Service;

namespace LCTMoodle.Controllers
{
    public class TraLoiController : Controller
    {
        /// <summary>
        /// Lấy danh sách trả lời theo mã câu hỏi
        /// </summary>
        /// <param name="ma">Mã câu hỏi</param>
        /// <param name="tu">Từ dòng thứ</param>
        /// <param name="den">Đến dòng thứ</param>
        public JsonResult CauHoi_LayTraLoi(int ma, int tu, int den)
        {
            //Lấy trả lời
            List<TraLoiViewModel> traLois = TraLoiService.layTraLoiTheoMaCauHoi(ma, 0, -1);

            //Kiểm tra
            if (traLois == null)
            {
                return Json(new
                    {
                        trangThai = "Lấy danh sách trả lời thất bại"
                    }
                );
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/TraLoi/CauHoi_LayTraLoi.cshtml", traLois)
            }
            );
        }

        /// <summary>
        /// Đăng câu trả lời
        /// </summary>
        [ValidateInput(false)]
        public JsonResult CauHoi_DangTraLoi(FormCollection form)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Json(new 
                        {
                            trangThai = "Chưa đăng nhập (Đăng trả lời)"
                        }
                    );
            }
            #endregion Kiểm tra quyền
            #region Kiểm tra thông tin
            if (form["MaCauHoi"] == "" || form["NoiDung"] == "")
            {
                return Json(new
                {
                    trangThai = "Thông tin chưa đủ (Đăng trả lời)"
                }
                    );
            }
            #endregion Kiểm tra thông tin

            //Lấy câu trả lời
            TraLoiDataModel traLoi = new TraLoiDataModel();
            traLoi.maCauHoi = Convert.ToInt32(form["MaCauHoi"]);
            traLoi.noiDung = form["NoiDung"];
            traLoi.maNguoiTao = (Session["NguoiDung"] as NguoiDungViewModel).ma;

            //Thêm trả lời
            traLoi.ma = TraLoiService.themTraLoi(traLoi);
            if (traLoi.ma == 0)
            {
                return Json(new
                    {
                        trangThai = "Thêm trả lời thất bại"
                    });
            }

            //Lấy trả lời vừa thêm
            List<TraLoiViewModel> model = new List<TraLoiViewModel>
                {
                    TraLoiService.layTraLoiTheoMaTraLoi(traLoi.ma)
                };

            return Json(new
                {
                    trangThai = "OK",
                    ketQua = ControllerHelper.RenderRazorViewToString("~/Views/TraLoi/CauHoi_LayTraLoi.cshtml", model)
                }
            );
        }

        /// <summary>
        /// Xóa trả lời
        /// </summary>
        /// <param name="ma">Mã trả lời</param>
        public ContentResult XoaTraLoi(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Xóa trả lời)");
            }

            //Lấy người dùng để kiểm tra quyền xóa (quản lý, người tạo)
            NguoiDungViewModel nguoiDung = Session["nguoiDung"] as NguoiDungViewModel;

            //Nếu người dùng là quản lý => có thể xóa
            if (nguoiDung.loaiNguoidung != "QuanLy")
            {
                //Lấy trả lời để kiểm tra quyền xóa (người tạo)
                TraLoiViewModel traLoi = TraLoiService.layTraLoiTheoMaTraLoi(ma);

                //Kiểm tra
                if (traLoi == null)
                {
                    return Content("Kiểm tra quyền xóa trả lời thất bại");
                }

                //Kiểm tra quyền
                if (traLoi.nguoiTao.ma != nguoiDung.ma)
                {
                    return Content("Không có quyền xóa trả lời");
                }
            }
            #endregion Kiểm tra quyền

            //Có quyền xóa => xóa
            //Xóa + kiểm tra
            if (!TraLoiService.xoaTraLoiTheoMaTraLoi(ma))
            {
                return Content("Xóa trả lời thất bại");
            }

            return Content("OK");
        }

        /// <summary>
        /// Đánh giá trả lời tốt
        /// </summary>
        /// <param name="ma">Mã trả lời</param>
        public ContentResult DanhGiaTraLoiTot(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Đánh giá trả lời tốt)");
            }

            //Kiểm tra người dùng có phải là người tạo trả lời hay không
            if ((Session["NguoiDung"] as NguoiDungViewModel).ma == TraLoiService.layTraLoiTheoMaTraLoi(ma).nguoiTao.ma)
            {
                return Content("Không thể tự đánh giá mình");
            }
            #endregion Kiểm tra quyền

            //Cập nhật & Kiểm tra
            if (!TraLoiService.capNhatDanhGiaTraLoi(ma, 1, (Session["NguoiDung"] as NguoiDungViewModel).ma))
            {
                return Content("Đánh giá Trả lời thất bại");
            }

            return Content("OK");
        }

        /// <summary>
        /// Đánh giá trả lời xấu
        /// </summary>
        /// <param name="ma">Mã trả lời</param>
        /// <returns></returns>
        public ContentResult DanhGiaTraLoiXau(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Đánh giá trả lời xấu)");
            }

            //Kiểm tra người dùng có phải là người tạo trả lời hay không
            if ((Session["NguoiDung"] as NguoiDungViewModel).ma == TraLoiService.layTraLoiTheoMaTraLoi(ma).nguoiTao.ma)
            {
                return Content("Không thể tự đánh giá mình");
            }
            #endregion Kiểm tra quyền

            //Cập nhật & Kiểm tra
            if (!TraLoiService.capNhatDanhGiaTraLoi(ma, -1, (Session["NguoiDung"] as NguoiDungViewModel).ma))
            {
                return Content("Đánh giá trả lời thất bại");
            }

            return Content("OK");
        }

        /// <summary>
        /// Duyệt trả lời
        /// </summary>
        /// <param name="ma">Mã trả lời</param>
        /// <returns></returns>
        public ContentResult DuyetTraLoi(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Duyệt trả lời)");
            }

            //Kiểm tra quyền duyệt trả lời
            NguoiDungViewModel nguoiDung = Session["NguoiDung"] as NguoiDungViewModel;

            //Lấy người tạo câu hỏi
            int maNguoiTaoCauHoi = CauHoiService.layCauHoiTheoMaTraLoi(ma).nguoiTao.ma;
            //Người dùng phải là người tạo câu hỏi
            if (nguoiDung.ma != maNguoiTaoCauHoi)
            {
                return Content("Không có quyền duyệt trả lời");
            }
            #endregion Kiểm tra quyền

            //Lấy trả lời
            TraLoiViewModel traLoi = TraLoiService.layTraLoiTheoMaTraLoi(ma);
            //Người dùng không phải là người tạo trả lời
            if (nguoiDung.ma == traLoi.nguoiTao.ma)
            {
                return Content("Không thể tự duyệt (Duyệt trả lời)");
            }

            //OK
            if (!TraLoiService.capNhatTrangThaiTraLoi(ma, 1))
            {
                return Content("Duyệt trả lời thất bại");
            }

            return Content("OK");
        }

        /// <summary>
        /// Bỏ duyệt trả lời
        /// </summary>
        /// <param name="ma">Mã trả lời</param>
        /// <returns></returns>
        public ContentResult BoDuyetTraLoi(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Đăng nhập để duyệt trả lời");
            }

            //Kiểm tra quyền duyệt trả lời
            NguoiDungViewModel nguoiDung = Session["NguoiDung"] as NguoiDungViewModel;

            //Lấy người tạo câu hỏi
            int maNguoiTaoCauHoi = CauHoiService.layCauHoiTheoMaTraLoi(ma).nguoiTao.ma;
            //Người dùng phải là người tạo câu hỏi
            if (nguoiDung.ma != maNguoiTaoCauHoi)
            {
                return Content("Không có quyền duyệt trả lời");
            }

            //Lấy trả lời
            TraLoiViewModel traLoi = TraLoiService.layTraLoiTheoMaTraLoi(ma);
            //Người dùng không phải là người tạo trả lời
            if (nguoiDung.ma == traLoi.nguoiTao.ma)
            {
                return Content("Không thể tự duyệt trả lời của mình");
            }
            #endregion Kiểm tra quyền

            //OK
            if (!TraLoiService.capNhatTrangThaiTraLoi(ma, 0))
            {
                return Content("Duyệt trả lời thất bại");
            }

            return Content("OK");
        }
    }
}
